"""定义函数"""
def my_abs(x):
    if x >= 0:
        return x
    else:
        return -x

x = my_abs(-10)
print(x)
# 如果没有return语句，函数执行完毕后也会返回结果，只是结果为None。
# 如果想定义一个什么事也不做的空函数，可以用pass语句：
# pass语句什么都不做，那有什么用？实际上pass可以用来作为占位符，比如现在还没想好怎么写函数的代码，就可以先放一个pass，让代码能运行起来。
def nop():
    pass
print(nop)
# pass还可以用在其他语句里，比如：
def test(age):
    if age >= 18:
        pass
# 调用函数时，如果参数个数不对，Python解释器会自动检查出来，并抛出TypeError：
# 但是如果参数类型不对，Python解释器就无法帮我们检查。
# my_abs('test')
# abs('test')

# 数据类型检查可以用内置函数isinstance()实现
# def my_abs(x):
#     if not isinstance(x, (int, float)):
#         raise TypeError('类型错误')
#     if x >= 0:
#         return x
#     else:
#         return -x
# my_abs('test')

# 返回多个值
import math # 导入math包
def mov(x, y, step, angle=0): # 坐标、位移和角度
    nx = x + step * math.cos(angle)
    ny = y - step * math.sin(angle)
    return nx, ny
# 返回值是一个tuple
print(mov(0, 0, 2, math.pi / 3))
# 在语法上，返回一个tuple可以省略括号，而多个变量可以同时接收一个tuple，按位置赋给对应的值，所以，Python的函数返回多值其实就是返回一个tuple


def quadratic(a, b, c):
    return (-b-math.sqrt(b*b-4*a*c))/(2*a), (-b+math.sqrt(b*b-4*a*c))/(2*a)

print(quadratic(2, 3, 1))
print(quadratic(1, 3, -4))
